001 /* 002 * Copyright 2005 Stephen J. McConnell. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 013 * implied. 014 * 015 * See the License for the specific language governing permissions and 016 * limitations under the License. 017 */ 018 019 package net.dpml.metro.data; 020 021 import java.io.Serializable; 022 import java.net.URI; 023 import java.net.URISyntaxException; 024 025 /** 026 * Abstract base class for directives. 027 * 028 * @author <a href="http://www.dpml.net">Digital Product Meta Library</a> 029 * @version 1.0.1 030 */ 031 public abstract class AbstractDirective implements Serializable 032 { 033 //-------------------------------------------------------------------------- 034 // static 035 //-------------------------------------------------------------------------- 036 037 /** 038 * Serial version identifier. 039 */ 040 static final long serialVersionUID = 1L; 041 042 //-------------------------------------------------------------------------- 043 // utilities 044 //-------------------------------------------------------------------------- 045 046 /** 047 * Return the hashcode for the instance. 048 * @return the instance hashcode 049 */ 050 public int hashCode() 051 { 052 return getClass().hashCode(); 053 } 054 055 /** 056 * Utility to hash an array. 057 * @param array the array 058 * @return the hash value 059 */ 060 int hashArray( Object[] array ) 061 { 062 if( null == array ) 063 { 064 return 0; 065 } 066 int hash = 0; 067 for( int i=0; i<array.length; i++ ) 068 { 069 Object object = array[i]; 070 hash ^= hashValue( object ); 071 } 072 return hash; 073 } 074 075 /** 076 * Utility to hash an object. 077 * @param value the object 078 * @return the hash value 079 */ 080 int hashValue( Object value ) 081 { 082 if( null == value ) 083 { 084 return 0; 085 } 086 else if( value instanceof Object[] ) 087 { 088 return hashArray( (Object[]) value ); 089 } 090 else 091 { 092 return value.hashCode(); 093 } 094 } 095 096 /** 097 * Test if the supplied object is equal to this object. 098 * @param other the object to compare with this instance 099 * @return TRUE if the supplied object is equal to this object 100 */ 101 public boolean equals( Object other ) 102 { 103 if( null == other ) 104 { 105 return false; 106 } 107 else 108 { 109 return ( other instanceof AbstractDirective ); 110 } 111 } 112 113 /** 114 * Utility to compare two object for equality. 115 * @param a the first object 116 * @param b the second object 117 * @return true if the objects are equal 118 */ 119 boolean equals( Object a, Object b ) 120 { 121 if( null == a ) 122 { 123 return ( null == b ); 124 } 125 else 126 { 127 return a.equals( b ); 128 } 129 } 130 131 //-------------------------------------------------------------------------- 132 // Part 133 //-------------------------------------------------------------------------- 134 135 /** 136 * Return the part handler uri. 137 * @return the uri of the part handler 138 */ 139 public URI getPartHandlerURI() 140 { 141 return PART_HANDLER_URI; 142 } 143 144 /** 145 * Static utility to create the part handler uri. 146 * @param spec the part handler uri string 147 * @return the constant part handler uri 148 */ 149 protected static URI setupURI( String spec ) 150 { 151 try 152 { 153 return new URI( spec ); 154 } 155 catch( URISyntaxException ioe ) 156 { 157 return null; 158 } 159 } 160 161 private static final URI PART_HANDLER_URI = setupURI( "artifact:part:dpml/metro/dpml-metro-runtime#1.0.1" ); 162 163 }